// author: Shelman
// description: 封装的使用posix接口实现的UDP工具类
#pragma once


#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <functional>

#include "GlobalDef.h"


// UDP工具类
class UdpUtil
{
public:
    /*****************************************************
     * 功能：构造函数
     * ***************************************************/
    UdpUtil();

    /*****************************************************
     * 功能：析构函数
     * ***************************************************/
    virtual ~UdpUtil();

    /*****************************************************
     * 功能：设置接收数据的回调，
     * 输入参数：
     *      pfnCallback：数据回调函数
     * ***************************************************/
    void setDataRecvCallback(const UdpDataReceivedCallback &pfnCallback);

    /*****************************************************
     * 功能：开启UDP端口
     * 输入参数：
     *      strLocalInfo：本地连接信息
     * 返回值：
     *      bool：开启结果，true -- 成功，false -- 失败
     * ***************************************************/
    bool start(const NetworkConnInfo &strLocalInfo);

    /*****************************************************
     * 功能：停止UDP
     * ***************************************************/
    void stop();

    /*****************************************************
     * 功能：向远端发送数据
     * 输入参数：
     *      stRemoteInfo：远端信息
     *      strData：待发送的数据
     * 返回值：
     *      bool：发送结果，true -- 发送成功，false -- 发送失败
     * ***************************************************/
    bool sendData(const NetworkConnInfo &stRemoteInfo, const std::string &strData);

private:
    /*****************************************************
     * 功能：处理接收数据的线程
     * ***************************************************/
    void onRecvDataThread();

    /*****************************************************
     * 功能：关闭socket
     * ***************************************************/
    void closeSocket();

private:
    volatile bool m_bRunning = false; // 是否运行的标识
    int m_iLocalSockFd = -1; // 本地socket句柄
    NetworkConnInfo m_stLocalConnInfo; // 本地端连接信

    std::mutex m_mt4SendData; // 发送数据互斥锁
    std::thread m_th4RecvThread; // 数据接收的线程
    std::mutex m_mt4PfnCallback;          // 回调函数互斥锁
    UdpDataReceivedCallback m_pfn4RecvDataCb; // 数据接收回调函数
};

